﻿// Copyright 2017 the original author or authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

using Steeltoe.Common.Util;
using System;
using System.Collections.Generic;

namespace Steeltoe.Messaging.Support
{
    /// <summary>
    /// TODO:  Try to make this internal
    /// </summary>
    public interface IMessageHeaderAccessor
    {
        Guid? Id { get; }

        long? Timestamp { get; }

        MimeType ContentType { get; set; }

        bool LeaveMutable { get; set; }

        bool IsMutable { get; }

        bool IsModified { get; set; }

        IMessageHeaders MessageHeaders { get; }

        string ReplyChannelName { get; set; }

        object ReplyChannel { get; set; }

        string ErrorChannelName { get; set; }

        object ErrorChannel { get; set; }

        bool EnableTimestamp { get; set; }

        IIDGenerator IdGenerator { get; set; }

        void SetImmutable();

        IMessageHeaders ToMessageHeaders();

        IDictionary<string, object> ToDictionary();

        object GetHeader(string headerName);

        void SetHeader(string name, object value);

        void SetHeaderIfAbsent(string name, object value);

        void RemoveHeader(string headerName);

        void RemoveHeaders(params string[] headerPatterns);

        void CopyHeaders(IDictionary<string, object> headersToCopy);

        void CopyHeadersIfAbsent(IDictionary<string, object> headersToCopy);
    }
}
